package com.berchen.线程池;

import java.util.concurrent.*;

/**
 * 线程池：提供了一个线程队列，队列中保存着一系列所有等待状态的线程。避免了创建与销毁线程的额外开销。提高了响应的速度。
 * 线程池的体系结构：
 *  java.util.concurrent.Executor：负责线程的使用与调度的根接口。
 *      |--ExecutorService子接口：线程池的主要接口。
 *          |--ThreadPoolExecutor：实现类
 *          |--ScheduledExecutorService子接口：负责线程的调度的子接口。
 *              |--ScheduledThreadPoolExecutor实现类：继承了ThreadPoolExecutor同时实现了ScheduledExecutorService接口。
 * 工具类：Executors
 * ExecutorService newFixedThreadPool()：创建固定大小的线程池。
 * ExecutorService newCachedThreadPool()：缓存线程池，线程池的数量不固定，可以根据需求自动的更新数量。
 * ExecutorService newSingleThreadExecutor()：创建单个线程池（线程池中只有一个线程）。
 *
 * ScheduledExecutorService newScheduledThreadPool()：创建固定大小的线程池。可以延迟或定时的执行任务。
 */
public class TestThreadPool {

    public static void main(String[] args){

        ExecutorService pool = Executors.newFixedThreadPool(5);   // 创建5个大小的线程池。

        ThreadPoolDemo tpd=new ThreadPoolDemo();
        for (int i = 0; i <10 ; i++) {

            // 为线程池中的线程分配任务
//            pool.submit(tpd); // Runnable接口
            Future<Integer> submit = pool.submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    int sum = 0;
                    for (int j = 0; j < 100; j++) {

                        sum += j;
                    }
                    return sum;
                }
            });
            try {
                Integer integer = submit.get();// 获取返回值
                System.out.println(integer);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }

        // 关闭线程池
        pool.shutdown();    // 以平和的方式关闭线程池（等待线程池中的任务完成之后才关闭。）。
//        pool.shutdownNow(); // 立即关闭，不管线程中还有没有任务。
    }
}
class ThreadPoolDemo implements Runnable{

    private int i=0;
    @Override
    public void run() {

        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+" : "+i);
        }
    }
}
